package nl.saxion.act.bus;

import java.util.ArrayList;
import java.util.List;

import nl.saxion.act.gameframework.WorldView;
import nl.saxion.act.logging.Assert;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;

public class HalteProxy extends BuswereldItem {
	private String         haltenaam;
    private Locatie        locatie;  
    private List<Reiziger> reizigers = new ArrayList<Reiziger>();

    public HalteProxy( String naam, Locatie eenLocatie, Buswereld world )
    {   
    	super( (int)eenLocatie.x, (int)eenLocatie.y, world, Buswereld.TILE_TYPES.HALTE );
        Assert.check( naam != null, "geen geldige naam opgegeven (null)" );
        haltenaam = naam;
        locatie = eenLocatie;
    }
    
    public String         getNaam()      { return haltenaam;                            }
    public Locatie        getLocatie()   { return locatie;                              }
    public List<Reiziger> getReizigers() { return new ArrayList<Reiziger>( reizigers ); }
    public boolean        isEmpty()      { return reizigers.size() ==  0;               }
    
    public boolean contains( Reiziger reiziger )
    {
        Assert.check( reiziger  != null, "geen geldige reiziger opgegeven (null)" );

        return reizigers.contains( reiziger );
    }

    protected void add( Reiziger reiziger ) 
    {
        Assert.check( reiziger != null, "geen geldige reiziger (null) !" );
        Assert.check( ! reizigers.contains( reiziger ), "Deze reiziger stond al bij deze halte" );

        reizigers.add( 0, reiziger ); // zet achteraan op index 0
    }
    
    protected void remove( Reiziger reiziger )
    {
        Assert.check( reiziger != null,               "geen geldige reiziger (null) !"                                 );
        Assert.check( reizigers.contains( reiziger ), "reiziger staat niet bij deze halte, kan niet verwijderd worden" );

        reizigers.remove( reiziger );
    }
    
	public void draw( Canvas canvas, WorldView worldView ) {
		Buswereld busWorld = (Buswereld) worldView.getWorld();
		Bitmap halte       = busWorld.getBitmap( Buswereld.TILE_TYPES.HALTE      );
		worldView.drawBitmap( halte, position, canvas );

		drawReizigers(canvas, worldView, busWorld);
	}

	private void drawReizigers( Canvas canvas, WorldView worldView, Buswereld busWorld ) {
		Bitmap instapper   = busWorld.getBitmap( Buswereld.TILE_TYPES.INSTAPPER  );
		Bitmap uitstapper  = busWorld.getBitmap( Buswereld.TILE_TYPES.UITSTAPPER );

		Rect positionInWorld = new Rect( 0, -instapper.getHeight() * 3, instapper.getWidth() * 3 , 0 );
		positionInWorld.offset( position.left - 20, position.bottom  );
		for ( Reiziger reiziger : reizigers ) {
			positionInWorld.offset( 30, 40 );
			if ( reiziger.isOpBestemming( haltenaam ) )
				worldView.drawBitmap( uitstapper, positionInWorld, canvas );
			else
				worldView.drawBitmap( instapper,  positionInWorld, canvas );
		}
	}

    public String name() {
    	return this.getClass().getSimpleName() + " " + haltenaam + ": (" + position.centerX() + ", " + position.bottom + ")";
    }
}
